// package cn.ruleengine.web.aspect;
//
// import cn.ruleengine.web.annotation.DataPermission;
// import cn.ruleengine.web.config.Context;
// import cn.ruleengine.web.exception.DataPermissionException;
// import cn.ruleengine.web.service.DataPermissionService;
// import cn.ruleengine.web.vo.user.UserData;
// import lombok.extern.slf4j.Slf4j;
// import org.aspectj.lang.ProceedingJoinPoint;
// import org.aspectj.lang.annotation.Around;
// import org.aspectj.lang.annotation.Aspect;
// import org.aspectj.lang.reflect.MethodSignature;
// import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
// import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
// import org.springframework.expression.EvaluationContext;
// import org.springframework.expression.Expression;
// import org.springframework.expression.ExpressionParser;
// import org.springframework.expression.spel.standard.SpelExpressionParser;
// import org.springframework.expression.spel.support.SimpleEvaluationContext;
// import org.springframework.stereotype.Component;
//
// import javax.annotation.Resource;
// import javax.validation.ValidationException;
// import java.io.Serializable;
// import java.lang.reflect.Method;
//
// /**
//  * 数据操作权限
//  */
// @Slf4j
// @Component
// @ConditionalOnProperty(prefix = "auth", name = "enable", havingValue = "true")
// @Aspect
// public class DataPermissionAspect {
//
//     @Resource
//     private DataPermissionService dataPermissionService;
//
//     /**
//      * spel表达式解析器
//      */
//     private final ExpressionParser parser = new SpelExpressionParser();
//     private final LocalVariableTableParameterNameDiscoverer discoverer = new LocalVariableTableParameterNameDiscoverer();
//
//     /**
//      * 此注解主要防止通过url越权操作数据
//      *
//      * @param joinPoint      joinPoint
//      * @param dataPermission 数据权限注解
//      */
//     @Around("@annotation(dataPermission)")
//     public Object around(ProceedingJoinPoint joinPoint, DataPermission dataPermission) throws Throwable {
//         UserData userData = Context.getCurrentUser();
//         log.debug("开始校验数据权限,用户Id:{},是否为管理员：{}，注解信息：{}", userData.getId(), userData.getIsAdmin(), dataPermission);
//         if (userData.getIsAdmin()) {
//             return joinPoint.proceed();
//         }
//         //获取参数对象数组
//         Object[] args = joinPoint.getArgs();
//         //获取方法
//         Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
//         //获取方法参数名
//         String[] params = this.discoverer.getParameterNames(method);
//         if (params == null || params.length == 0) {
//             throw new ValidationException("没有获取到任何参数");
//         }
//         EvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();
//         for (int len = 0; len < params.length; len++) {
//             context.setVariable(params[len], args[len]);
//         }
//         Expression expression = this.parser.parseExpression(dataPermission.id());
//         Serializable id = expression.getValue(context, Serializable.class);
//         // 不影响后续逻辑
//         if (id == null) {
//             log.info("校验数据权限，当前Id为null，跳过");
//             return joinPoint.proceed();
//         }
//         Boolean result = this.dataPermissionService.validDataPermission(id, dataPermission);
//         if (result) {
//             return joinPoint.proceed();
//         } else {
//             throw new DataPermissionException("你没有权限执行此操作");
//         }
//     }
//
// }
